-- 优惠劵id
local voucherId = ARGV[1]
-- 用户id
local userId = ARGV[2]

-- 剩余数量key
local quantityKey = 'voucher:quantity:' .. voucherId

-- 用户优惠劵key
local userQuantityKey = 'voucher:user:' .. voucherId

-- 优惠券状态key
local statusKey = 'voucher:status:' .. voucherId

-- 优惠券失效时间key
local expirationTimeKey = 'voucher:expiration_time:' .. voucherId

-- 过期优惠券集合key
local expiredVouchersKey = 'voucher:expired'

-- 获取优惠券状态
local status = tonumber(redis.call('GET', statusKey))

-- 判断优惠券状态是否过期
if status == 2 then
    return -2  -- 优惠券已过期
end

-- 获取当前时间戳
local time = redis.call('TIME')
local seconds = tonumber(time[1])


-- 获取优惠券失效时间戳
local expirationTime = tonumber(redis.call('GET', expirationTimeKey))

-- 判断优惠券是否过期
if seconds > expirationTime then
    -- 更新优惠券状态为过期（2）
    redis.call('set', statusKey, 2)
    -- 将过期的优惠券ID添加到过期优惠券集合中
    redis.call('sadd', expiredVouchersKey, voucherId)
    return -2  -- 优惠券已过期
end

if status == 0 then
    return -3 -- 下架
end

-- 获取优惠券剩余数量
local quantity = tonumber(redis.call('GET', quantityKey))

-- 判断库存是否充足
if quantity <= 0 then
    return 0  -- 库存不足
end

-- 判断用户是否已经领取优惠劵
if redis.call('sismember', userQuantityKey, userId) == 1 then
    return -1  -- 用户已领取优惠劵
end

-- 扣库存、添加用户优惠劵
redis.call('incrby', quantityKey, -1)
redis.call('sadd', userQuantityKey, userId)
return 1  -- 成功领取优惠劵
